package com.suning.sawp.service.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * 日期工具类<br>
 * 〈功能详细描述〉
 *
 * @author 12061818
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class DateUtils {

    private static final Logger LOGGER = LoggerFactory.getLogger(DateUtils.class);

    /**
     * 日期格式
     */
    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";

    /**
     * 日期格式
     */
    public static final String DEFAULT_POINT_DATE_PATTERN = "yyyy.MM.dd";
    /**
     * 日期格式
     */
    public static final String DEFAULT_MINI_DATE_PATTERN = "MM-dd";

    /**
     * 中文日期格式
     */
    public static final String DEFAULT_CHINA_DATE_PATTERN = "yyyy年MM月dd日";

    /**
     * 时间格式
     */
    public static final String ACCURATE_MINUTES_PATTERN = "yyyy-MM-dd HH:mm";

    public static final String DEFAULT_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    public static final String DEFAULT_DAY_PATTERN = "yyyy-MM-dd";

    public static final String DEFAULT_MONTH_PATTERN = "yyyy-MM";

    public static final String DEFAULY_FULL_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";

    public static final String YYYYMMDD_PATTERN = "yyyyMMdd";

    public static final String YYYYMM_PATTERN = "yyyyMM";

    public static final String YYYYMMDDHHMMSS_PATTERN = "yyyyMMddHHmmss";

    public static final String YYYY = "yyyy";

    public static final String MM_DD_PATTERN = "MM-dd";
    
    public static final String MM_DD_HH_MM_PATTERN = "MM-dd HH:mm";

    /**
     * 带星期信息的时间格式
     */
    public static final String DATE_FORMAT_WEEKDAY = "EE yyyy-MM-dd HH:mm:ss";

    public static final String ACCURATE_MINUTES_PATTERN_2 = "yyyy/MM/dd HH:mm";

    public static final int SEXAGESIMAL = 60;
    public static final int DAYHOURS = 24;
    public static final int SECONDMILLISECOND = 1000;

    /**
     * 
     * 功能描述: 获取当前日期 yyyy-MM-dd<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getNowShortStr() {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
        return sdf.format(new Date());
    }

    /**
     * 根据格式转换字符串为日期对象
     * 
     * @param dateStr 日期字符串
     * @param format 日期格式
     * @return 日期对象
     */
    public static Date getDateByStr(String dateStr, String format) {
        if (StringUtils.isEmpty(format)) {
            format = DEFAULT_DATE_PATTERN;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.parse(dateStr);
        } catch (ParseException e) {
            LOGGER.error("parse find wrong.", e);
        }
        return new Date();
    }

    public static Date getDateByStr(String dateStr) {
        if (StringUtils.isNotBlank(dateStr)) {
            SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
            try {
                return sdf.parse(StringUtils.trim(dateStr));
            } catch (ParseException e) {
                LOGGER.error("parse find wrong.", e);
            }
        }
        return null;
    }

    /**
     * 
     * 功能描述: 获取当前日期 yyyy-MM-dd<br>
     * 〈功能详细描述〉
     * 
     * @param delay 正数date时间后移，负数则前移
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getNextShortStr(int delay) {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
        return sdf.format(getNextDay(new Date(), delay));
    }

    /**
     * 
     * 功能描述: 获取当前日期对应偏移值的时间日期字符串<br>
     * 〈功能详细描述〉
     *
     * @param delay 偏移量，正数之后，负数之前
     * @param pattern 时间格式
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getNextDayStr(int delay, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(getNextDay(new Date(), delay));
    }

    /**
     * 修改时间的格式
     *
     * @param pattern 转换后的格式
     * @param date 转换前的时间对象 如果为null，则默认当前时间
     * @return 返回新时间格式的时间对象
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getNowDateShort(String pattern, Date date) {
        if (StringUtils.isBlank(pattern)) {
            pattern = DEFAULT_DATE_PATTERN;
        }

        // 如果为null，则默认当前时间
        if (null == date) {
            date = new Date();
        }
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        String dateString = formatter.format(date);
        try {
            date = formatter.parse(dateString);
        } catch (ParseException e) {
            LOGGER.error("pattern transfer find wrong.", e);
        }
        return date;
    }

    /**
     * 修改相对当前时间的日期格式
     * 
     * @param pattern 转换后的格式
     * @param delay 相对当前时间的天数间隔，负数代表过去日期间隔
     * @return 返回相对当前时间 （转换后的时间格式）
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getNowDateShort(String pattern, int delay) {
        return getNowDateShort(pattern, getNextDay(new Date(), delay));
    }

    /**
     * 查询两个日期的绝对相隔天数 如果前面比后面日期早,则返回负数
     * 
     * @param date1 非NUll 不含时分秒的时间
     * @param date2 非NUll 不含时分秒的时间
     * @return 两个日期的绝对相隔天数
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static int intervalOfDate(Date date1, Date date2) {
        return (int) ((date1.getTime() - date2.getTime()) / (DAYHOURS * SEXAGESIMAL * SEXAGESIMAL * SECONDMILLISECOND));
    }

    /**
     * 
     * 功能描述: 返回当前时间 时间格式 yyyy-MM-dd HH:mm:ss<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getNowLongStr() {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_TIME_PATTERN);
        return sdf.format(new Date());
    }

    /**
     * 
     * 功能描述: 精确到分钟<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getNowAccurateMinutesStr() {
        SimpleDateFormat sdf = new SimpleDateFormat(ACCURATE_MINUTES_PATTERN);
        return sdf.format(new Date());
    }

    /**
     * 
     * 功能描述: 返回当前时间 时间格式 yyyy-MM-dd HH:mm:ss.SSS<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getNowFullStr() {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULY_FULL_TIME_PATTERN);
        return sdf.format(new Date());
    }

    /**
     * 
     * 功能描述: 转换Date->String 时间格式 yyyy-MM-dd HH:mm:ss<br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getLongStr(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_TIME_PATTERN);
        return sdf.format(date);
    }

    /**
     * 根据格式，转换时间对象成固定格式的字符串
     * 
     * @param date 默认的时间对象，如果为null，则默认当前时间
     * @param format 时间格式，如果为空或者不合法，默认格式为 yyyy-MM-dd HH:mm:ss
     * @return 据格式，转换时间对象成固定格式的字符串
     */
    public static String getDateStrByFormat(Date date, String format) {
        if (StringUtils.isEmpty(format)) {
            format = DEFAULT_TIME_PATTERN;
        }
        SimpleDateFormat sdf = null;
        try {
            sdf = new SimpleDateFormat(format);
        } catch (IllegalArgumentException e) {
            LOGGER.error("the given pattern is invalid.", e);
            sdf = new SimpleDateFormat(DEFAULT_TIME_PATTERN);
        }
        if (null == date) {
            date = new Date();
        }
        return sdf.format(date);
    }

    /**
     * 
     * 功能描述: 获得某一个时间+偏移量（单位天）的时间<br>
     * 〈功能详细描述〉
     *
     * @param date
     * @param delay 正数date时间后移，负数则前移
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getNextDay(Date date, int delay) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_MONTH, delay);
        return c.getTime();
    }

    /**
     * 
     * 功能描述: 获得某一个时间+偏移量（单位天）的时间<br>
     * 〈功能详细描述〉
     *
     * @param date
     * @param delay 正数date时间后移，负数则前移
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getNextDay(String dateStr, int delay, String format) {
        Date date = getDateByStr(dateStr, format);
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_MONTH, delay);
        return getDateStrByFormat(c.getTime(), format);
    }

    public static String getFormatDay(String dateStr, String inFormat, String outFormat) {
        Date date = getDateByStr(dateStr, inFormat);
        return getDateStrByFormat(date, outFormat);
    }

    /**
     * 
     * 功能描述: 获得当天的零点时间<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getNowZeroPoint() {
        return getZeroPoint(new Date());
    }

    /**
     * 
     * 功能描述: 取某天日期的零点<br>
     * 〈功能详细描述〉
     *
     * @param dateTime
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getZeroPoint(Date date) {
        Calendar c = Calendar.getInstance();
        c.setLenient(false);
        c.setTime(date);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        return c.getTime();
    }

    /**
     * 将长整型的日期字符串转换成日期对象
     * 
     * @param timeMillisStr 长整型的日期字符串 如果非长整型，返回当前时间
     * @return 转换后日期对象
     */
    public static Date getDateFromMillisStr(String timeMillisStr) {
        try {
            Long valueOf = Long.valueOf(timeMillisStr);
            return new Date(valueOf);
        } catch (NumberFormatException e) {
            LOGGER.error("getDateFromMillisStr find wrong.", e);
            return new Date();
        }
    }

    /**
     * 查询上月月份 YYYYMM
     * 
     * @return
     */
    public static String getLastMonth() {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formate = new SimpleDateFormat(YYYYMM_PATTERN);
        calendar.add(Calendar.MONTH, -1);
        return formate.format(calendar.getTime());
    }

    /**
     * 查询上月月份 YYYYMM
     * 
     * @return
     */
    public static String getLastMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        SimpleDateFormat formate = new SimpleDateFormat(YYYYMM_PATTERN);
        calendar.add(Calendar.MONTH, -1);
        return formate.format(calendar.getTime());
    }

    /**
     * 下个月 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getNextMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        return calendar.getTime();
    }

    public static String getNextMonthStr(String dateStr, String format, int delay) {
        Date date = getDateByStr(dateStr, format);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, delay);
        return getDateStrByFormat(calendar.getTime(), format);
    }

    public static String getNextMonthStr(Date date, String format, int delay) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, delay);
        return getDateStrByFormat(calendar.getTime(), format);
    }

    /**
     * 查询月份YYYYMM 〈功能详细描述〉
     *
     * @param between
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getMonth(int between) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formate = new SimpleDateFormat(YYYYMM_PATTERN);
        calendar.add(Calendar.MONTH, between);
        return formate.format(calendar.getTime());
    }

    /**
     * 查询日期的月份 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param data
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getMonth(long data) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formate = new SimpleDateFormat(YYYYMM_PATTERN);
        calendar.setTimeInMillis(data);
        return formate.format(calendar.getTime());
    }

    /**
     * 查询上月月份 YYYYMM
     * 
     * @return
     */
    public static String getLastMonth(String dateStr, String format) {
        return getLastMonth(getDateByStr(dateStr, format));
    }

    /**
     * 查询本月月份 YYYYMM
     * 
     * @return
     */
    public static String getThisMonth() {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formate = new SimpleDateFormat(YYYYMM_PATTERN);
        return formate.format(calendar.getTime());
    }

    /**
     * 计算出上月末,或者所传日期月末日期
     * 
     * @param date
     * @return
     */
    public static Date getMaxMonthDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (null != date) {
            calendar.setTime(date);
        } else {
            calendar.setTime(new Date());
            calendar.add(Calendar.MONTH, -1);
        }
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return calendar.getTime();
    }

    /**
     * 判断当天是否是一月的第一天
     * 
     * @return
     */
    public static boolean isFirstDayByMonth() {
        return getFirstDayZeroPointOfMonth(0).getTime() == getNowZeroPoint().getTime();
    }

    /**
     * 
     * 功能描述: 以当前月为原点，取前后月份的第一天零点时间<br>
     * 〈功能详细描述〉
     *
     * @param diff 0-当月, 负数-当月之前, 正数-当月之后
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getFirstDayZeroPointOfMonth(int diff) {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, diff);
        c.set(Calendar.DAY_OF_MONTH, 1);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

    /**
     * 
     * 功能描述: 取日期所在星期几<br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getWeekOfDate(Date date) {
        String[] cals = { "日", "一", "二", "三", "四", "五", "六" };
        return getWeekOfDate(date, cals);
    }

    public static String getWeekOfDate(Date date, String[] cals) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int w = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) {
            w = 0;
        }
        return cals[w];
    }

    /**
     * 
     * 功能描述: 获取日期所在月份<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static int getMonOfDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 
     * 功能描述: 日期所在月的<br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getMonthEndDate(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(Calendar.HOUR_OF_DAY, 24);
        return cal.getTime();
    }

    /**
     * 
     * 功能描述: 取本周一零点<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getTimesWeekmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        if (Calendar.SUNDAY == cal.get(Calendar.DAY_OF_WEEK)) {
            // 如果是周末，往前到一个
            cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR) - 1);
        }
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return cal.getTime();
    }

    /**
     * 
     * 功能描述: 取本周日24点<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getTimesWeeknight() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getTimesWeekmorning());
        cal.add(Calendar.DAY_OF_WEEK, 7);
        return cal.getTime();
    }

    /**
     * 一月的第一天<br>
     * 2016-09-01 00:00:00 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getFirstDateOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (null != date) {
            calendar.setTime(date);
        } else {
            calendar.setTime(new Date());
            calendar.add(Calendar.MONTH, -1);
        }
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMinimum(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE, calendar.getActualMinimum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, calendar.getActualMinimum(Calendar.SECOND));
        return calendar.getTime();
    }

    /**
     * 一月的最后一天<br>
     * 2016-09-30 23:59:59 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getLastDateOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (null != date) {
            calendar.setTime(date);
        } else {
            calendar.setTime(new Date());
            calendar.add(Calendar.MONTH, -1);
        }
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
        return calendar.getTime();
    }

    /**
     * 取一天最后时间,23:59:59 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getLastDateOfDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (null != date) {
            calendar.setTime(date);
        } else {
            calendar.setTime(new Date());
        }
        calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
        return calendar.getTime();
    }

    public static String getLastDateOfMonthStr(Date date, String format) {
        Calendar calendar = Calendar.getInstance();
        if (null != date) {
            calendar.setTime(date);
        } else {
            calendar.setTime(new Date());
            calendar.add(Calendar.MONTH, -1);
        }
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));

        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(calendar.getTime());
    }

    /**
     * 下一年 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getNextYear(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, 1);
        return calendar.getTime();
    }

    /**
     * 计算年日期 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param date
     * @param between
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getNextYear(Date date, int between) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, between);
        return calendar.getTime();
    }

    /**
     * 
     * 功能描述: 获取去年同期数据yyyyMM<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getLastYearMonthStr() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.YEAR, -1);
        SimpleDateFormat formate = new SimpleDateFormat(YYYYMM_PATTERN);
        return formate.format(cal.getTime());
    }

    /**
     * 计算同比日期 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param srcDate
     * @param pattern
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String getYoyDate(Date srcDate, String pattern) {
        if (null == srcDate) {
            return null;
        }
        int days = getDaysOfYear(srcDate);
        Calendar c = Calendar.getInstance();
        c.setTime(getFirstMondayOfYear());
        c.add(Calendar.DAY_OF_YEAR, days - 1);
        if (StringUtils.isBlank(pattern)) {
            return DateUtils.getDateStrByFormat(c.getTime(), DateUtils.YYYYMMDD_PATTERN);
        } else {
            return DateUtils.getDateStrByFormat(c.getTime(), pattern);
        }
    }

    /**
     * 取距离今年第一个星期一相差的天数 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    private static int getDaysOfYear(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int days = cal.get(Calendar.DAY_OF_YEAR);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

        int week = (days - dayOfWeek) / 7;
        return week * 7 + dayOfWeek - 1;
    }

    /**
     * 
     * 功能描述: 取去年的第一个星期一<br>
     * 〈功能详细描述〉
     *
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    private static Date getFirstMondayOfYear() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.YEAR, -1);
        cal.set(Calendar.MONTH, 0);
        cal.set(Calendar.DAY_OF_YEAR, 0);
        int i = 1;
        if (Calendar.SUNDAY == cal.get(Calendar.DAY_OF_WEEK)) {
            i = 0;
        }
        Calendar cal1 = Calendar.getInstance();
        cal1.add(Calendar.YEAR, -1);
        cal1.set(Calendar.MONTH, 0);
        cal1.set(Calendar.WEEK_OF_MONTH, 1 + i);
        cal1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return cal1.getTime();
    }

    /**
     * 
     * 功能描述: 获取当前时间到今天23:59:59的秒数<br>
     * 
     * @return
     */
    public static int end2TodaySeconds() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);

        int seconds = (int) ((cal.getTimeInMillis() - Calendar.getInstance().getTimeInMillis()) / 1000);
        return seconds;
    }
}
